/**
 *  功能：Aliyun iot 云服务配置
 *  作者：tuut
 *  时间：2023-11-28
 *  描述：
 *      1. 云账户数据初始化
 *      2. 推送iot设备采集数据
 *      3.
*/
#include "Sketch_oct31b_aliyun.h"
#include <Arduino.h>
#include <ArduinoJson.h>
bool post_aliyun = false;
void powerCallback(JsonVariant p);
/****************************************Aliyun part****************************************/
Sketch_oct31b_aliyun::Sketch_oct31b_aliyun() {
  Serial.println("Sketch_oct31b_aliyun Object Created.");
  HTTPS_SERVER = "iot-auth." + String(REGION_ID) + ".aliyuncs.com";                           //认证地址
  MQTT_SERVER = String(PRODUCT_KEY) + ".iot-as-mqtt." + String(REGION_ID) + ".aliyuncs.com";  //阿里云MQTT服务地址
  // 相关主题
  // #define TOPIC_SET_PROPERTY "/sys/" PRODUCT_KEY "/{dName}/thing/service/property/set"
  TOPIC_SET_PROPERTY = "/sys/" + String(PRODUCT_KEY) + "/{dName}/thing/service/property/set";
}

Sketch_oct31b_aliyun::~Sketch_oct31b_aliyun() {
  Serial.println("Sketch_oct31b_aliyun Object Deleted.");
}

void Sketch_oct31b_aliyun::initAliyunManager(WiFiClient espClient) {
  cal_delayStart = millis();
  strcpy(aliyunConfig.product_key, PRODUCT_KEY);
  strcpy(aliyunConfig.device_name, DEVICE_NAME);
  strcpy(aliyunConfig.device_secret, DEVICE_SECRET);
  strcpy(aliyunConfig.region_id, REGION_ID);
  String topicSetProperty = TOPIC_SET_PROPERTY;
  // deviceName placeholder替换
  topicSetProperty.replace("{dName}", aliyunConfig.device_name);
  Serial.println("初始化 iot，需传入 wifi 的 client，和设备产品信息...");
  Serial.print("推送到广播通知");
  Serial.println(topicSetProperty);
  const size_t capacity = JSON_ARRAY_SIZE(1) + 2 * JSON_OBJECT_SIZE(4) + 60;
  DynamicJsonDocument doc(capacity);
  JsonObject root = doc.to<JsonObject>();
  root["mqtt_server"] = MQTT_SERVER;
  root["product_key"] = aliyunConfig.product_key;
  root["device_name"] = aliyunConfig.device_name;
  root["device_secret"] = aliyunConfig.device_secret;
  root["region_id"] = aliyunConfig.region_id;
  serializeJson(root, Serial);
  Serial.println("");
  // 初始化 iot，需传入 wifi 的 client，和设备产品信息
  AliyunIoTSDK::begin(espClient, aliyunConfig.product_key, aliyunConfig.device_name, aliyunConfig.device_secret, aliyunConfig.region_id);
  // 绑定一个设备属性回调，当远程修改此属性，会触发 powerCallback
  // PowerSwitch 是在设备产品中定义的物联网模型的 id
  char* p = (char*)"PowerSwitch";
  AliyunIoTSDK::bindData(p, powerCallback);
  // 发送一个数据到云平台，LightLuminance 是在设备产品中定义的物联网模型的 id
  // AliyunIoTSDK::send("LightLuminance", 100);
}

void Sketch_oct31b_aliyun::upload2Aliyun(String str_monitor, long _interval) {
  if ((millis() - cal_delayStart) >= _interval) {
    Serial.print("向阿里云推送监测数据: ");
    Serial.println(str_monitor);
    /* 2. 创建一个DynamicJsonDocument对象*/
    /* 计算创建一个DynamicJsonDocument对象将要占用多大的内存空间 */
    const size_t capacity = JSON_ARRAY_SIZE(1) + 2 * JSON_OBJECT_SIZE(6) + 60;
    /* 通过计算好的内存空间传入参数创建一个DynamicJsonDocument对象 */
    DynamicJsonDocument doc(capacity);
    /* 3. 使用deserializeJson()函数来解析Json数据 */
    deserializeJson(doc, str_monitor);
    Serial.println("");
    /* 4. 获取解析后的数据信息 */
    String _a = doc["inSideCurrentTemperature"].as<String>();
    String _b = doc["currentHumidity"].as<String>();
    String _c = doc["ch2o"].as<String>();
    // +1 是为了留一个空位给字符串的终止符
    char _a_charArr[_a.length() + 1];
    strcpy(_a_charArr, _a.c_str());
    char _b_charArr[_b.length() + 1];
    strcpy(_b_charArr, _b.c_str());
    char _c_charArr[_c.length() + 1];
    strcpy(_c_charArr, _c.c_str());
    if (post_aliyun) {
      // AliyunIoTSDK::loop();
      // AliyunIoTSDK::send("CurrentTemperature", _a_charArr);
      Serial.println(_a_charArr);
      // AliyunIoTSDK::send("CurrentHumidity", _b_charArr);
      Serial.println(_b_charArr);
      // AliyunIoTSDK::send("ch2o", _c_charArr);
      Serial.println(_c_charArr);
    }
    cal_delayStart = millis();
  }
  delay(3000);
}

// 电源属性修改的回调函数
void powerCallback(JsonVariant p) {
  int PowerSwitch = p["PowerSwitch"];
  if (PowerSwitch == 1) {
    // 启动设备
    Serial.print("启动设备");
  } else {
    Serial.print("关闭设备");
  }
}
